home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / ORBMECHD / HILL'S.C < prev    next >
Text File  |  1991-02-18  |  8KB  |  296 lines

  1. /**********************************************************************
  2.     Karl Dishaw 18 Feb 91
  3.     Hill's Equations applied.  This function applies the force-free
  4.     solution of Hill's Equations to give the ╞V cost of an intercept 
  5.     and rendezvous maneuver in similar orbits. 
  6.  
  7.     Method from Kaplan, Modern Spacecraft Dynamics & Control, pp112-5
  8. **********************************************************************/
  9.  
  10. #include     "orbmech.h"
  11. #include    "SANE.h"
  12. #include    "math.h"
  13. #define        HILLSEQNREC_SIZE    110
  14.  
  15. extern    DialogPtr        LambertDia, HohmannDia, HillsDia, KeplerDia, whichDialog, gHelpDia;
  16. extern    EventRecord        gEvent;
  17. extern    TEHandle        TEH;
  18. extern    decform            gdecform;
  19. extern    int                dirty;                    
  20.  
  21. struct    ParamRec
  22.     {
  23.     extended    value;
  24.     Str255        name;
  25.     };
  26.  
  27. extern    struct    ParamRec    gParameter;
  28.  
  29. struct    HillsEqnRec
  30.     {
  31.     extended orbit_radius; 
  32.     extended altitude_difference, init_x_vel;
  33.     extended init_y_vel, epoch_difference, flight_time;
  34.     extended delta_v_x_initial, delta_v_y_initial, delta_v_x_final;
  35.     extended delta_v_y_final, delta_v_total;
  36.     } ;
  37.     
  38. typedef        struct    HillsEqnRec        *HillsEqnPtr;
  39.  
  40.  
  41. /**************************************/
  42.  
  43. Hills()
  44. {
  45.     Handle        inputH, itemHandle;
  46.     Str255        orStr, adStr, ivxStr, ivyStr, edStr, ftStr;
  47.     Str255        dvixStr, dviyStr, dvfxStr, dvfyStr, dvtStr;
  48.     int            itemType;
  49.     Rect        itemRect;
  50.     Boolean        dont_panic = 1, miFlag = 0, auFlag = 0;
  51.     decimal        result;
  52.     
  53.     ControlHandle    kmSecBut, miHrBut, radBut;
  54.  
  55.     struct        HillsEqnRec        *data;
  56.  
  57.     Ptr            temp;
  58.  
  59.     Str255        q, w, e, r, t, y, u, i, o, p, j, k, l, m, n;    
  60.     
  61.     temp = NewPtr( HILLSEQNREC_SIZE );
  62.     
  63.     data = ( HillsEqnPtr) temp;
  64.  
  65.     pStrCopy("\p\rOrbital Rendezvous Costs", q);
  66.     pStrCopy("\p\r     orbit radius:         ", w);
  67.     pStrCopy("\p\r     altitude difference:  ", e);
  68.     pStrCopy("\p\r     epoch difference:     ", r);
  69.     pStrCopy("\p\r     flight time:          ", t);
  70.     pStrCopy("\p\r     primary:              ", y);
  71.     pStrCopy("\p\r     initial x velocity:   ", u);
  72.     pStrCopy("\p\r     initial y velocity:   ", i);
  73.     pStrCopy("\p\r\rDelta-V required", o);
  74.     pStrCopy("\p\r     initial x:     ", j);
  75.     pStrCopy("\p\r     initial y:     ", k);
  76.     pStrCopy("\p\r     final x:       ", l);
  77.     pStrCopy("\p\r     final y:       ", m);
  78.     pStrCopy("\p\r     total:         ", n);
  79.     pStrCopy("\p\r\r", p);
  80.  
  81.     GetDItem( HillsDia, ORB_RAD, &itemType, &inputH, &itemRect);
  82.     GetIText( inputH, &orStr );
  83.     Pstr_to_extended( &orStr, &data->orbit_radius, &dont_panic );
  84.     
  85.     GetDItem( HillsDia, EPOCH_DIFF, &itemType, &inputH, &itemRect);
  86.     GetIText( inputH, &edStr );
  87.     Pstr_to_extended( &edStr, &data->epoch_difference, &dont_panic );
  88.     
  89.     GetDItem( HillsDia, ALT_DIFF, &itemType, &inputH, &itemRect);
  90.     GetIText( inputH, &adStr );
  91.     Pstr_to_extended( &adStr, &data->altitude_difference, &dont_panic );
  92.     
  93.     GetDItem( HillsDia, VX, &itemType, &inputH, &itemRect);
  94.     GetIText( inputH, &ivxStr );
  95.     Pstr_to_extended( &ivxStr, &data->init_x_vel, &dont_panic );
  96.     
  97.     GetDItem( HillsDia, VY, &itemType, &inputH, &itemRect);
  98.     GetIText( inputH, &ivyStr );
  99.     Pstr_to_extended( &ivyStr, &data->init_y_vel, &dont_panic );
  100.     
  101.     GetDItem( HillsDia, FLIGHT_TIME, &itemType, &inputH, &itemRect);
  102.     GetIText( inputH, &ftStr );
  103.     Pstr_to_extended( &ftStr, &data->flight_time, &dont_panic );
  104.     
  105.     GetDItem ( HillsDia, KM_SEC, &itemType, &kmSecBut, &itemRect);
  106.     GetDItem ( HillsDia, MI_HR, &itemType, &miHrBut, &itemRect);
  107.     GetDItem ( HillsDia, RADIANS, &itemType, &radBut, &itemRect);
  108.     
  109.     if ( dont_panic )
  110.     {
  111.     
  112.     if ( ! GetCtlValue ( kmSecBut ) )
  113.         if ( GetCtlValue ( miHrBut ) ) {
  114.             data->orbit_radius *=  MI_CONV;
  115.             data->epoch_difference *=  MI_CONV;
  116.             data->altitude_difference *=  MI_CONV;
  117.             data->flight_time *= HR_CONV;
  118.             data->init_x_vel *=  MI_CONV / HR_CONV;
  119.             data->init_y_vel *=  MI_CONV / HR_CONV;
  120.             miFlag = 1;
  121.         }
  122.         else {
  123.             data->orbit_radius *=  AU_CONV;
  124.             data->epoch_difference *=  AU_CONV;
  125.             data->altitude_difference *=  AU_CONV;
  126.             data->flight_time *= YR_CONV;
  127.             data->init_x_vel *=  AU_CONV / YR_CONV;
  128.             data->init_y_vel *=  AU_CONV / YR_CONV;
  129.             auFlag = 1;
  130.         }    
  131.  
  132.     TEInsert( q+1, *q, TEH );
  133.     TEInsert( w+1, *w, TEH );
  134.     TEInsert( orStr+1, *orStr, TEH );
  135.     TEInsert( e+1, *e, TEH );
  136.     TEInsert( adStr+1, *adStr, TEH );
  137.     TEInsert( r+1, *r, TEH );
  138.     TEInsert( edStr+1, *edStr, TEH );
  139.     TEInsert( t+1, *t, TEH );
  140.     TEInsert( ftStr+1, *ftStr, TEH );
  141.     TEInsert( y+1, *y, TEH );
  142.     TEInsert( gParameter.name+1, *gParameter.name, TEH );
  143.     TEInsert( u+1, *u, TEH );
  144.     TEInsert( ivxStr+1, *ivxStr, TEH );
  145.     TEInsert( i+1, *i, TEH );
  146.     TEInsert( ivyStr+1, *ivyStr, TEH );
  147.  
  148.     rendezvous_calculations( data );
  149.     
  150.     if ( miFlag )  {
  151.         data->delta_v_x_initial /=  MI_CONV / HR_CONV;
  152.         data->delta_v_y_initial /=  MI_CONV / HR_CONV;
  153.         data->delta_v_x_final /=  MI_CONV / HR_CONV;
  154.         data->delta_v_y_final /=  MI_CONV / HR_CONV;
  155.         data->delta_v_total /=  MI_CONV / HR_CONV;
  156.     }
  157.     
  158.     if ( auFlag )  {
  159.         data->delta_v_x_initial /=  AU_CONV / YR_CONV;
  160.         data->delta_v_y_initial /=  AU_CONV / YR_CONV;
  161.         data->delta_v_x_final /=  AU_CONV / YR_CONV;
  162.         data->delta_v_y_final /=  AU_CONV / YR_CONV;
  163.         data->delta_v_total /=  AU_CONV / YR_CONV;
  164.     }
  165.         
  166.     if ( data->delta_v_x_initial > 9999.0  || data->delta_v_x_initial <  .000001 ) 
  167.         gdecform.style = FLOATDECIMAL;
  168.     else
  169.         gdecform.style = FIXEDDECIMAL;
  170.     
  171.     num2dec( &gdecform, data->delta_v_x_initial, &result );    
  172.     dec2str( &gdecform, &result, dvixStr );
  173.  
  174.     if ( data->delta_v_y_initial > 9999.0  || data->delta_v_y_initial <  .000001 ) 
  175.         gdecform.style = FLOATDECIMAL;
  176.     else
  177.         gdecform.style = FIXEDDECIMAL;
  178.     
  179.     num2dec( &gdecform, data->delta_v_y_initial, &result );    
  180.     dec2str( &gdecform, &result, dviyStr );
  181.  
  182.     if ( data->delta_v_x_final > 9999.0 || data->delta_v_x_final <  .000001 ) 
  183.         gdecform.style = FLOATDECIMAL;
  184.     else
  185.         gdecform.style = FIXEDDECIMAL;
  186.     
  187.     num2dec( &gdecform, data->delta_v_x_final, &result );    
  188.     dec2str( &gdecform, &result, dvfxStr );    
  189.  
  190.     if ( data->delta_v_y_final > 9999.0 || data->delta_v_y_final <  .000001 ) 
  191.         gdecform.style = FLOATDECIMAL;
  192.     else
  193.         gdecform.style = FIXEDDECIMAL;
  194.     
  195.     num2dec( &gdecform, data->delta_v_y_final, &result );    
  196.     dec2str( &gdecform, &result, dvfyStr );    
  197.  
  198.     if ( data->delta_v_total > 9999.0 || data->delta_v_total <  .000001 ) 
  199.         gdecform.style = FLOATDECIMAL;
  200.     else
  201.         gdecform.style = FIXEDDECIMAL;
  202.     
  203.     num2dec( &gdecform, data->delta_v_total, &result );    
  204.     dec2str( &gdecform, &result, dvtStr );    
  205.  
  206.     TEInsert( o+1, *o, TEH );    
  207.     TEInsert( j+1, *j, TEH );
  208.     TEInsert( dvixStr+1, *dvixStr, TEH );
  209.     TEInsert( k+1, *k, TEH );
  210.     TEInsert( dviyStr+1, *dviyStr, TEH );
  211.     TEInsert( l+1, *l, TEH );
  212.     TEInsert( dvfxStr+1, *dvfxStr, TEH );
  213.     TEInsert( m+1, *m, TEH );
  214.     TEInsert( dvfyStr+1, *dvfyStr, TEH );
  215.     TEInsert( n+1, *n, TEH );
  216.     TEInsert( dvtStr+1, *dvtStr, TEH );
  217.     TEInsert( p+1, *p, TEH );
  218.  
  219.     dirty = 1;
  220.     
  221.     GetDItem( HillsDia, DVIX, &itemType, &itemHandle, &itemRect);
  222.     SetIText( itemHandle, dvixStr );
  223.     
  224.     GetDItem( HillsDia, DVIY, &itemType, &itemHandle, &itemRect);
  225.     SetIText( itemHandle, dviyStr );
  226.     
  227.     GetDItem( HillsDia, DVFX, &itemType, &itemHandle, &itemRect);
  228.     SetIText( itemHandle, dvfxStr );
  229.  
  230.     GetDItem( HillsDia, DVFY, &itemType, &itemHandle, &itemRect);
  231.     SetIText( itemHandle, dvfyStr );
  232.  
  233.     GetDItem( HillsDia, DVT, &itemType, &itemHandle, &itemRect);
  234.     SetIText( itemHandle, dvtStr );
  235.  
  236.     ShowSelect();
  237.     }
  238. }
  239.  
  240. /*********************************/
  241.  
  242. rendezvous_calculations( data )
  243. struct    HillsEqnRec    *data;
  244. {
  245.     extended    mu, a, xo, yo, t, vyi, vxi;
  246.     extended    n, nt, snt, cnt, aa, b, c, d, e, f;
  247.     extended    vyo, vxo, dvyi, dvxi, vxf, vyf, dtot;
  248.     
  249.     mu = gParameter.value;
  250.  
  251.     a = data->orbit_radius;
  252.     xo = data->altitude_difference;
  253.     yo = data->epoch_difference;
  254.     t = data->flight_time;
  255.     
  256.     vyi = data->init_y_vel;
  257.     vxi = data->init_x_vel;
  258.     
  259.     n = sqrt( mu / ( a * a * a ) );
  260.     
  261.     nt = n * t;
  262.     snt = sin( nt );
  263.     cnt = cos( nt );
  264.     
  265.     aa = ( 6.0 * xo * ( nt - snt ) - yo ) * n * snt;
  266.     b = 2.0 * n * xo * ( 4.0 - 3.0 * cnt ) * ( 1.0 - cnt );
  267.     c = ( 4.0 * snt - 3.0 * nt ) * snt;
  268.     d = 4.0 * ( 1.0 - cnt) * ( 1.0 - cnt );
  269.     
  270.     vyo = ( aa - b ) / ( c + d );
  271.     
  272.     e = n * xo * ( 4.0 - 3.0 * cnt );
  273.     f = 2.0 * ( 1.0 - cnt ) * vyo;
  274.     
  275.     vxo = - ( e + f ) / snt;
  276.     
  277.     dvyi = vyo - vyi;
  278.     dvxi = vxo - vxi;
  279.     
  280.     vxf = vxo * cnt + ( 2.0 * vyo + 3.0 * n * xo ) * snt;
  281.     vyf = - 2.0 * vxo * snt + ( 4.0 * vyo + 6.0 * n * xo ) * cnt
  282.                 - ( 3.0 * vyo + 6.0 * n * xo );
  283.                         
  284.     dtot = sqrt( dvyi * dvyi + dvxi * dvxi) + sqrt( vxf * vxf + vyf * vyf);
  285.     
  286.     data->delta_v_x_initial = dvxi;
  287.     
  288.     data->delta_v_y_initial = dvyi;
  289.     
  290.     data->delta_v_x_final = vxf;
  291.     
  292.     data->delta_v_y_final = vyf;
  293.     
  294.     data->delta_v_total = dtot;
  295. }
  296.